home *** CD-ROM | disk | FTP | other *** search
- DECLARE SUB InitScrn ()
- DECLARE SUB DoPoint (N!, SIG!, PRN$, EL$)
- DECLARE SUB PlotAvg (a$, N!)
- DECLARE SUB Gfield (a!, a$, B$)
- COMMON SHARED MX(), NO(), MI(), SS(), MA()
- DIM MX(2, 40)
- DIM NO(2, 99), MI(2, 99), SS(2, 99), MA(2, 99)
- CLS : PRINT "SIGPLOT.bas Version 1.1 by Bob Bruninga, WB4APR"
- PRINT
- PRINT "This APRS program monitors the GPS NMEA data for the GPGSV sentence to extract"
- PRINT "Azimuth, Elevation and Signal strength from satellites in view. It can"
- PRINT "monitor TWO GPS units simultaneously so you can compare antennas. SIGPLOT"
- PRINT "displays the present Signal and maximum value for each satellite as well as"
- PRINT "plotting the Elevation pattern."
- PRINT
- PRINT "Each second's data is plotted as it comes in, but you may press either D or"
- PRINT "L to force a new screen and plot of only the AVERAGE value, minimum, and"
- PRINT "maximum value. The D only shows the DOTS, but the L connects the dots"
- PRINT "with a LINE so that the elevation plot is easier to discern."
- PRINT
- PRINT "After about an hour of satellite movements, a signal value has been seen from"
- PRINT "most angles giving a smooth elevation plot. Azimuths are currently ignored."
- PRINT
- PRINT "REMEMBER THESE Three QUESTIONABLE ASSUMPTIONS:"
- PRINT " 1) All satellites are transmitting equal output powers"
- PRINT " 2) Your AZIMUTH antenna pattern is OMNIdirectional"
- PRINT " 3) Your sky view is unobstructed in all directions."
- PRINT "This means that a satellite at 45 degrees to the east will be averaged with a"
- PRINT "all other satellites at 45 degrees at all other azimuths, etc."
- PRINT
- INPUT "Enter the COM# port for the 1st GPS unit (COM1 or COM2), [COM1]"; a$
- IF a$ = "" THEN Port$ = "COM1" ELSE Port$ = a$
- OPEN Port$ + ":4800,n,8,1,cs0,cd0,ds0" FOR RANDOM AS #1
- INPUT "Enter the COM# port for the 2nd GPS unit (COM1, COM2 or NONE), [NONE]"; a$
- IF UCASE$(LEFT$(a$, 1)) = "C" THEN
- OPEN a$ + ":4800,n,8,1,cs0,cd0,ds0" FOR RANDOM AS #2
- Port2 = 2
- END IF
- ON ERROR GOTO errortrap
- SCREEN 9
- WIDTH 80, 43
- CALL InitScrn
- DO
- GOSUB More1
- LOCATE 5, 1: PRINT LEFT$("1: " + a$, 79)
- IF LEFT$(a$, 6) = "$GPGGA" THEN
- LOCATE 43, 1: PRINT LEFT$(a$, 79);
- ELSEIF LEFT$(a$, 6) = "$GPGSV" THEN
- a = 7
- CALL Gfield(a, a$, NSS$)
- CALL Gfield(a, a$, NCS$): LOCATE 1 + VAL(NCS$), 1: PRINT LEFT$(a$, 79)
- CALL Gfield(a, a$, NSA$)
- L = LEN(a$) - 4
- DO WHILE a > 2 AND a < L
- CALL Gfield(a, a$, PRN$)
- LOCATE 9 + VAL(PRN$), 1: PRINT PRN$;
- CALL Gfield(a, a$, EL$): PRINT RIGHT$(" " + EL$, 4);
- CALL Gfield(a, a$, AZ$): PRINT RIGHT$(" " + AZ$, 4);
- CALL Gfield(a, a$, SNR$)
- SIG = VAL(SNR$)
- IF SIG > 20 AND SIG < 60 THEN CALL DoPoint(1, SIG, PRN$, EL$)
- LOOP
- END IF
- REM Now PORT TWO! * * * * * * * * * * * * * * * ** * * **** **
- IF Port2 THEN
- GOSUB More2
- IF a2$ = "NoComms" THEN Port2 = 0
- LOCATE 6, 1: PRINT LEFT$("2: " + a2$, 79)
- IF LEFT$(a2$, 6) = "$GPGGA" THEN
- ELSEIF LEFT$(a2$, 6) = "$GPGSV" THEN
- a = 7
- CALL Gfield(a, a2$, NSS$)
- CALL Gfield(a, a2$, NCS$)
- CALL Gfield(a, a2$, NSA$)
- L = LEN(a2$) - 4
- DO WHILE a > 2 AND a < L
- CALL Gfield(a, a2$, PRN$)
- LOCATE 9 + VAL(PRN$), 20
- CALL Gfield(a, a2$, EL$)
- CALL Gfield(a, a2$, AZ$)
- CALL Gfield(a, a2$, SNR$)
- SIG = VAL(SNR$)
- IF SIG > 20 AND SIG < 60 THEN CALL DoPoint(2, SIG, PRN$, EL$)
- LOOP
- END IF
- END IF
- a$ = UCASE$(INKEY$)
- IF a$ = "D" OR a$ = "L" THEN
- CALL InitScrn
- CALL PlotAvg(a$, 1)
- CALL PlotAvg(a$, 2)
- ELSEIF a$ = "R" THEN Port2 = 2: a2$ = ""
- END IF
- IF a$ = "Q" THEN END
- LOOP
- STOP
-
-
-
- More1: t = 1: j = 1: a = 0: Strt = TIMER
- DO WHILE j > 0 AND a = 0
- IF ABS(TIMER - Strt) >= t THEN j = 0: a$ = "NoComms": As$ = "": EXIT DO
- a = INSTR(As$, CHR$(13))
- IF a > 0 THEN a$ = LEFT$(As$, a - 1): As$ = MID$(As$, a + 1): EXIT DO
- IF LOC(1) > 0 THEN As$ = As$ + INPUT$(LOC(1), 1)
- LOOP
- DO WHILE LEFT$(a$, 1) < " " AND LEN(a$) > 0
- a$ = MID$(a$, 2)
- LOOP
- RETURN
-
- More2: t = 1: j = 1: a = 0: Strt = TIMER
- DO WHILE j > 0 AND a = 0
- IF ABS(TIMER - Strt) >= t THEN j = 0: a2$ = "NoComms": As2$ = "": EXIT DO
- a = INSTR(As2$, CHR$(13))
- IF a > 0 THEN a2$ = LEFT$(As2$, a - 1): As2$ = MID$(As2$, a + 1): EXIT DO
- IF LOC(2) > 0 THEN As2$ = As2$ + INPUT$(LOC(2), 2)
- LOOP
- DO WHILE LEFT$(a2$, 1) < " " AND LEN(a2$) > 0
- a2$ = MID$(a2$, 2)
- LOOP
- RETURN
-
-
-
- errortrap: RESUME NEXT
-
- SUB DoPoint (N, SIG, PRN$, EL$)
-
- ELd = VAL(EL$)
- SAT = VAL(PRN$): IF MX(N, SAT) < SIG THEN MX(N, SAT) = SIG
- ELr = ELd / 57.4
- SS(N, ELd) = SS(N, ELd) + SIG
- NO(N, ELd) = NO(N, ELd) + 1
- IF MI(N, ELd) = 0 THEN MI(N, ELd) = SIG
- IF SIG > MA(N, ELd) THEN MA(N, ELd) = SIG
- IF SIG < MI(N, ELd) THEN MI(N, ELd) = SIG
- COE = 7 * COS(ELr)
- SIE = 5 * SIN(ELr)
- PRINT " "; SIG;
- PRINT RIGHT$(" " + STR$(MX(N, SAT)), 3)
- C = 14: IF N = 2 THEN C = 12
- x = 200: y = 300: IF N = 2 THEN x = 198: y = 302
- CIRCLE (x + SIG * COE, y - SIG * SIE), 1, C
-
- END SUB
-
- SUB Gfield (a, a$, B$)
-
- B = INSTR(a + 1, a$, ",")
- IF B >= a + 1 THEN B$ = MID$(a$, a + 1, B - (a + 1)) ELSE B = 1: B$ = ""
- a = B
- END SUB
-
- SUB InitScrn
-
- CLS
- LOCATE 8, 1: PRINT "SAT EL AZ SIG MAX SG2 MX2"
- LOCATE 9, 1: PRINT "--- -- -- --- --- --- ---"
- LINE (240, 300)-(594, 48), 14, B
- REM x*7 and y*5 is a square plot
- FOR i = 0 TO 90
- a = i / 57.4
- PSET (240 + 350 * COS(a), 300 - 250 * SIN(a)), 15
- PSET (240 + 280 * COS(a), 300 - 200 * SIN(a)), 15
- PSET (240 + 210 * COS(a), 300 - 150 * SIN(a)), 15
- IF INT(i / 10) = i / 10 THEN
- CIRCLE (240 + 350 * COS(a), 300 - 250 * SIN(a)), 1, 15
- CIRCLE (240 + 280 * COS(a), 300 - 200 * SIN(a)), 1, 15
- CIRCLE (240 + 210 * COS(a), 300 - 150 * SIN(a)), 1, 15
- END IF
- NEXT
- LOCATE 39, 32: PRINT "SIGNAL STRENGTH 30 40 50"
-
- LOCATE 27, 32: PRINT "APRS SIGPLOT v1.1"
- LOCATE 29, 32: PRINT "D - shows min, avg"
- LOCATE 30, 32: PRINT " & max value DOTS"
- LOCATE 32, 32: PRINT "L - shows a LINE plot"
- LOCATE 34, 32: PRINT "R - will RETRY comms"
- LOCATE 36, 32: PRINT "Q - to QUIT."
-
- LOCATE 8, 55: PRINT "Let program run for"
- LOCATE 9, 55: PRINT "At least an hour to"
- LOCATE 10, 55: PRINT "fill in all angles."
- LOCATE 12, 65: PRINT "de WB4APR"
- END SUB
-
- SUB PlotAvg (a$, N)
-
- First = -1
- FOR i = 1 TO 90
- a = i / 57.4
- COE = 7 * COS(a)
- SIE = 5 * SIN(a)
- SA = 0: IF NO(N, i) > 0 THEN SA = SS(N, i) / NO(N, i)
- IF SA > 20 AND SA < 60 THEN
- x = 200: y = 300: C = 10
- IF N = 2 THEN x = 198: y = 302: C = 12
- IF a$ = "L" THEN
- IF First THEN
- X0 = x + SA * COE: Y0 = y - SA * SIE
- First = 0
- ELSE X1 = x + SA * COE: Y1 = y - SA * SIE
- LINE (X0, Y0)-(X1, Y1), C
- X0 = X1: Y0 = Y1
- END IF
- ELSE
- CIRCLE (x + SA * COE, y - SA * SIE), 3, C
- END IF
- CIRCLE (x + MI(N, i) * COE, y - MI(N, i) * SIE), 1, C
- CIRCLE (x + MA(N, i) * COE, y - MA(N, i) * SIE), 1, C
- END IF
- NEXT i
-
- END SUB
-
-